package cn.yh.nft.turbo.order.sharding.id;

import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;

/**
 * @ClassName: WorkerIdHolder
 * @Author: 草莓爱上啵啵
 */
public class WorkerIdHolder implements CommandLineRunner {

    private RedissonClient redissonClient;

    @Value("${order.client.name:workerId}")
    private String clientName;

    public static long WORKER_ID;

    public WorkerIdHolder(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    /**
 * 重写run方法以在程序启动时执行初始化操作
 * 该方法使用可变参数args，允许传递任意数量的字符串参数，但本例中未使用这些参数
 *
 * @param args 可变参数字符串数组，允许传递任意数量的字符串参数，本例中未使用
 * @throws Exception 如果方法遇到错误，抛出异常
 */
@Override
public void run(String... args) throws Exception {
    // 获取一个原子长整型对象，用于后续的分布式唯一标识生成
    RAtomicLong atomicLong = redissonClient.getAtomicLong(clientName);

    // 通过原子操作递增当前值，并取模32，用于分配一个在分布式环境下的唯一worker ID
    WORKER_ID = atomicLong.incrementAndGet() % 32;
}

}
